package com.cctc.juc.source;
/**
 * 【多线程（热频）知识点】
 * 面试题：
 * 背景知识：
 * 多线程技术：多线程技术主要用于解决处理器单元内多个线程执行的问题，它可以显著减少处理器单元的闲置时间，增加处理器单元的吞吐能力。
 * 多线程技术最佳实践：
 * 1）给线程起个和任务相关的名字，方便寻找 BUG 或追踪。
 * 2）最低限度的使用同步和锁，缩小同步范围。
 * 3）多使用 JUC 高级同步工具，少使用 wait 和 notify。
 * 例如：LockSupport、Semaphore、CountDownLatch、CyclicBarrier、Phaser 等。
 * 4）多使用 JUC 并发容器，少使用同步容器。
 * ... ...
 * 1. 什么是线程安全？如何确保线程安全？Vector 向量是一个线程安全类码？
 * 线程安全：如果一段代码（临界区代码块）在多线程环境下的运行结果和单线程时是一致的，而且相关变量（临界区资源）的值也和预期是一样的，那么这段代码和相关变量就是线程安全的。例如一个线程安全的计数器在被多线程共享使用时也不会出现计算失误问题。
 * 在 Java 中确保线程安全的方式有很多，包括：
 * - 使用 fianl “不可变” 类；
 * - 使用 volatile 变量 + cas 原子操作，以及基于二者实现的 Atomic 原子操作类；
 * - 使用 synchronized 内置锁、JUC 显式锁进行线程同步；
 * - 使用 JUC 并发容器；
 * - 使用 ThreadLocal 线程局部变量等等。
 * Vector 是一个线程安全的同步容器，它是使用 synchronized 同步方法实现线程安全的，而和它相似的 ArrayList 则不是线程安全的，而基于 ArrayList 和 COW 思想实现的 COWArrayList 并发容器则是线程安全的，且（读）并发性能远远优于 Vector 同步容器。
 * n. [美团] Spring Cloud 如何构建线程池？
 * n. [网易] 如何设计线程池？请手写一个线程池？
 * n. [有赞] 还有任务没执行，线程池被关闭了怎么办？
 * n. [美团] 如何实现一个百万级别 ops 的生产者、消费者程序？
 * n. [京东] 实现异步的 20 种方式有哪些？
 * 说明：异步，作为（应用）性能调优的一个常用方式，经常被用于各自高并发场景。
 * 异步，调用方调用过程中，不会同步阻塞等待结果，而是异步执行其他任务，等待通知主动获取结果，或等待回调被动填充结果。
 * 实现异步的 20 中方式：
 * - 创建 Thread 线程，实现异步；
 * - 使用线程池，实现（生产者 & 消费者模式）异步；
 * - Future + Callable（FutureTask），实现（调用方阻塞式获取结果，浪费了线程资源）[伪] 异步；
 * --> 每个 Future（异步任务）之间彼此都是孤立的，需要开发人员手动绑定，所以才有了 CompletaleFuture 将多个 Future 串联起来形成任务流。
 * - CompletaleFuture、Guava、Netty，实现（回调模式）[真] 异步；
 * --> 由于 CompletaleFuture 是 JDK 1.8 才提供的，所以才有了 Guava、Netty 等（回调模式）[真] 异步；
 * - ForkJoin 实现异步；
 * - Sevlet 3.0 实现异步；
 * - JDK 9 Flow、RxJava、Reactor，实现（响应模式）异步；
 * - Spring 注解 @Async 实现异步；
 * - Spring ApplicationEvent 事件、EventBus 框架，实现（发布 & 订阅模式）异步；
 * - RocketMQ、Redis 消息队列，实现分布式（发布 & 订阅模式）异步；
 * - RocketMQ 源码中的 ServiceThread 实现能急能缓的高性能异步；
 * - Distruptor 框架，实现异步；
 * - Kotlin、Project Loom 协程，实现异步。
 */